Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / active_sessions.py

Displaying Raw • Download


meshchatx/src/backend/active_sessions.py e5756d7ab065475a18acdcafc008a767fcff87e0 (e5756d7a) Text, 2.46 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Track active UI WebSocket sessions (IP and user-agent) for local multi-client warnings."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787threading
Tff7b72import T7ee787time
Tff7b72import T7ee787uuid
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any


Te6edf3_MAX_UA_LEN Tff7b72= T79c0ff512
Te6edf3_MAX_IP_LEN Tff7b72= T79c0ff128


Tff7b72def Td2a8ff_clean_ipTb4b4b4(Te6edf3valueTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3value Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleanedTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Tff7b72return Te6edf3cleanedTb4b4b4[Tb4b4b4:Te6edf3_MAX_IP_LENTb4b4b4]


Tff7b72def Td2a8ff_clean_user_agentTb4b4b4(Te6edf3valueTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3value Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleanedTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffunknownTa5d6ff"
T8b949e# Strip control characters that break logs or JSON displays.
Te6edf3cleaned Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3ch Tff7b72for Te6edf3ch Tff7b72in Te6edf3cleaned Tff7b72if Te6edf3chTff7b72.Td2a8ffisprintableTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleanedTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Tff7b72return Te6edf3cleanedTb4b4b4[Tb4b4b4:Te6edf3_MAX_UA_LENTb4b4b4]


Tff7b72def Td2a8ffshould_warn_multi_sessionTb4b4b4(Te6edf3countTb4b4b4: Tffa657intTb4b4b4, Te6edf3warning_enabledTb4b4b4: Tffa657boolTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Oracle: warn when two or more sessions are active and the setting is on."""
Tff7b72tryTb4b4b4:
Te6edf3active Tff7b72= Tffa657intTb4b4b4(Te6edf3countTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Tffa657boolTb4b4b4(Te6edf3warning_enabledTb4b4b4) Tff7b72and Te6edf3active Tff7b72>Tff7b72= T79c0ff2


Tff7b72class T56d364ActiveSessionTrackerTb4b4b4:
T8b949e"""In-memory registry of connected MeshChatX UI WebSocket clients."""

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffRLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sessionsTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}

Tff7b72def Td2a8ffaddTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tb4b4b4, Te6edf3ipTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4, Te6edf3user_agentTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3session_id Tff7b72= Te6edf3uuidTff7b72.Td2a8ffuuid4Tb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhex
Te6edf3entry Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3session_idTb4b4b4,
Ta5d6ff"Ta5d6ffipTa5d6ff"Tb4b4b4: Te6edf3_clean_ipTb4b4b4(Te6edf3ipTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffuser_agentTa5d6ff"Tb4b4b4: Te6edf3_clean_user_agentTb4b4b4(Te6edf3user_agentTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffconnected_atTa5d6ff"Tb4b4b4: Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sessionsTb4b4b4[Te6edf3session_idTb4b4b4] Tff7b72= Te6edf3entry
Tff7b72return Tffa657dictTb4b4b4(Te6edf3entryTb4b4b4)

Tff7b72def Td2a8ffremoveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3session_idTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3session_id Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleanedTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3cleanedTb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72is Tff7b72not Tff7b72None

Tff7b72def Td2a8ffcountTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sessionsTb4b4b4)

Tff7b72def Td2a8fflist_sessionsTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3rows Tff7b72= Tb4b4b4[Tffa657dictTb4b4b4(Te6edf3rowTb4b4b4) Tff7b72for Te6edf3row Tff7b72in Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4]
Te6edf3rowsTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3rowTb4b4b4: Tffa657floatTb4b4b4(Te6edf3rowTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffconnected_atTa5d6ff"Tb4b4b4) Tff7b72or T79c0ff0.0Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3rows

Tff7b72def Td2a8ffsnapshotTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3sessions Tff7b72= Tff7b72selfTff7b72.Td2a8fflist_sessionsTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Tffa657lenTb4b4b4(Te6edf3sessionsTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffsessionsTa5d6ff"Tb4b4b4: Te6edf3sessionsTb4b4b4,
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────